package logica;

import java.io.Serializable;

import javax.persistence.*;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;


/**
 * The persistent class for the HABITACION database table.
 * 
 */
@Entity
@Table(name="HABITACION")
@NamedQuery(name="Habitacion.findAll", query="SELECT h FROM Habitacion h")
public class Habitacion implements Serializable {
	private static final long serialVersionUID = 1L;
	private String nrohabitacion;
	private int mantenimiento;
	private Categoria categoria;
	private List<Reserva> reservas;
	private List<Estadia> estadias;

	public Habitacion() {
	}


	@Id
	@SequenceGenerator(name="HABITACION_NROHABITACION_GENERATOR", sequenceName="SECUENCIA")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="HABITACION_NROHABITACION_GENERATOR")
	@Column(unique=true, nullable=false, length=4)
	public String getNrohabitacion() {
		return this.nrohabitacion;
	}

	public void setNrohabitacion(String nrohabitacion) {
		this.nrohabitacion = nrohabitacion;
	}


	@Column(nullable=false, precision=1)
	public int getMantenimiento() {
		return this.mantenimiento;
	}

	public void setMantenimiento(int mantenimiento) {
		this.mantenimiento = mantenimiento;
	}


	//uni-directional many-to-one association to Categoria
	@ManyToOne
	@JoinColumn(name="ID_CATEGORIA", nullable=false)
	public Categoria getCategoria() {
		return this.categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}


	//bi-directional one-to-many association to Reserva
	@OneToMany(mappedBy="habitacion") 	//@Fetch(FetchMode.JOIN)fetch= FetchType.EAGER
	@Fetch(FetchMode.JOIN)
	public List<Reserva> getReservas() {
		return this.reservas;
	}

	public void setReservas(List<Reserva> reservas) {
		this.reservas = reservas;
	}

	public Reserva addReserva(Reserva reserva) {
		getReservas().add(reserva);
		reserva.setHabitacion(this);

		return reserva;
	}

	public Reserva removeReserva(Reserva reserva) {
		getReservas().remove(reserva);
		reserva.setHabitacion(null);

		return reserva;
	}
	
	@OneToMany(mappedBy="habitacion")
	//@Fetch(FetchMode.JOIN)
	public List<Estadia> getEstadias() {
		return estadias;
	}


	public void setEstadias(List<Estadia> estadias) {
		this.estadias = estadias;
	}

	public void addEstadia(Estadia estadia) {
		if (getEstadias().isEmpty()){
			estadias= new ArrayList<Estadia>();
			estadias.add(estadia);
		}
		else{
			getEstadias().add(estadia);
			estadia.setHabitacion(this);
		}
	}

	public Estadia removeEstadia(Estadia estadia) {
		getEstadias().remove(estadia);
		estadia.setHabitacion(null);

		return estadia;
	}

	
	
	public boolean isReservada (Calendar fecha){
		
		for (Reserva reserva : reservas) {
			//Calendar fechaSa = (Calendar) reserva.getFechaS().clone();
			//fechaSa.add(Calendar.DATE, 1);
			Calendar fechaEn = (Calendar) reserva.getFechaE().clone();
			fechaEn.add(Calendar.DATE, -1);
			if (fecha.after(fechaEn) && reserva.getFechaS().after(fecha))
				return true;
		}
		return false;
	}
	public boolean hasEstadia(Calendar fecha){		
		for (Estadia estadia : estadias) {
			Calendar fechaEn = (Calendar) estadia.getFechaEntrada().clone();
			fechaEn.add(Calendar.DATE, -1);
			if (fecha.after(fechaEn) && estadia.getFechaSalidaestimada().after(fecha))
				return true;
		}
		return false;
	}
	
	public boolean estaHabilitada(){
		if (mantenimiento == 1)
			return false;
		return true;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((categoria == null) ? 0 : categoria.hashCode());
		result = prime * result
				+ ((estadias == null) ? 0 : estadias.hashCode());
		result = prime * result + mantenimiento;
		result = prime * result
				+ ((nrohabitacion == null) ? 0 : nrohabitacion.hashCode());
		result = prime * result
				+ ((reservas == null) ? 0 : reservas.hashCode());
		return result;
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Habitacion other = (Habitacion) obj;
		if (categoria == null) {
			if (other.categoria != null)
				return false;
		} else if (!categoria.equals(other.categoria))
			return false;
		if (estadias == null) {
			if (other.estadias != null)
				return false;
		} else if (!estadias.equals(other.estadias))
			return false;
		if (mantenimiento != other.mantenimiento)
			return false;
		if (nrohabitacion == null) {
			if (other.nrohabitacion != null)
				return false;
		} else if (!nrohabitacion.equals(other.nrohabitacion))
			return false;
		if (reservas == null) {
			if (other.reservas != null)
				return false;
		} else if (!reservas.equals(other.reservas))
			return false;
		return true;
	}
	
public Reserva getReserva(Calendar fecha){
	for (Reserva reserva : reservas) {
		if(fecha.equals(reserva.getFechaE()) || fecha.after(reserva.getFechaE()) && reserva.getFechaS().after(fecha)|| fecha.equals(reserva.getFechaS()))
			return reserva;
	}
	return null;
}
}